package editorsvg.propiedades;

import editorsvg.editor.comandos.GestorComandos;
import java.awt.Color;
import java.awt.Font;
import java.util.ArrayList;
import java.util.Hashtable;
import java.util.List;

/**
 * Representa un grupo de propiedades.
 *
 * @author Jorge Berjano
 */
public class GrupoPropiedades implements Cloneable {

    private String titulo;
    private ArrayList<Propiedad> listaPropiedades;
    private Hashtable<String, Propiedad> diccionario;
    private Hashtable<String, Propiedad> diccionarioAtributosXml;
    private Propiedad propiedadContenidoXml;
    private GestorComandos gestorComandos;

    public GrupoPropiedades(String titulo) {
        this.titulo = titulo;
        listaPropiedades = new ArrayList<Propiedad>();
        diccionario = new Hashtable<String, Propiedad>();
        diccionarioAtributosXml = new Hashtable<String, Propiedad>();
    }

    @Override
    public String toString() {
        return titulo;
    }

//    @Override
//    public Object clone() throws CloneNotSupportedException {
//        GrupoPropiedades clon = (GrupoPropiedades) super.clone();
//        clon.listaPropiedades = new ArrayList<Propiedad>();
//        clon.diccionario = new Hashtable<String, Propiedad>();
//        clon.diccionarioAtributosXml = new Hashtable<String, Propiedad>();
//        
//        for (Propiedad propiedad : listaPropiedades) {
//            clon.agregarPropiedad((Propiedad) propiedad.clone());            
//        }
//        return clon;
//    }
    public String getTitulo() {
        return titulo;
    }

    public void setTitulo(String titulo) {
        this.titulo = titulo;
    }

    public List<Propiedad> getLista() {
        return listaPropiedades;
    }

    public void setPropietario(Object objeto) {
        for (Propiedad propiedad : listaPropiedades) {
            propiedad.setPropietario(objeto);
        }
    }

    public void agregarPropiedad(Propiedad propiedad) {
        if (propiedad != null) {
            listaPropiedades.add(propiedad);
            diccionario.put(propiedad.getNombreCampo(), propiedad);
            if (propiedad.getNombreAtributoXml() == null) {
                propiedadContenidoXml = propiedad;
            } else {
                diccionarioAtributosXml.put(propiedad.getNombreAtributoXml(), propiedad);
            }

            propiedad.setGestorComandos(gestorComandos);
        }
    }

    public int getNumeroPropiedades() {
        return listaPropiedades.size();
    }

    /**
     * Obtiene una propiedad.
     * @param nombre El nombre de la propiedad.
     */
    public Propiedad getPropiedad(String nombre) {
        return diccionario.get(nombre);
    }

    /**
     * Obtiene una propiedad por el nombreAtributoXml.
     * @param nombre El nombre de la propiedad.
     */
    public Propiedad getPropiedadAtributoXml(String nombreAtributoXml) {
        return diccionarioAtributosXml.get(nombreAtributoXml);
    }
    
    /**
     * Obtiene la propiedad que alberga el texto que contiene el elemento XML.
     */
    public Propiedad getPropiedadContenidoXml() {
        return propiedadContenidoXml;
    }

    /**
     * Obtiene una propiedad.
     * @param enumerado El enumerado que define a la propiedad.
     */
    public Propiedad obtenerPropiedad(Enum enumerado) {
        return getPropiedad(enumerado.name());
    }

    /**
     * Obtiene una propiedad.
     * @param indice El indice (ordinal) de la propiedad.
     */
    public Propiedad getPropiedad(int indice) {
        return listaPropiedades.get(indice);
    }

    public boolean parsearPropiedad(int indice, String valorString) {
        return listaPropiedades.get(indice).parsearPropiedad(valorString);
    }

    public void setGestorComandos(GestorComandos gestorComandos) {
        this.gestorComandos = gestorComandos;
        for (Propiedad propiedad : listaPropiedades) {
            propiedad.setGestorComandos(gestorComandos);
        }
    }
}
